package com.briup;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

/**
 * @program: Maven_demo01
 * @description: xml解析-sax
 * @author: rendc
 * @create: 2024-11-22 10:49
 **/
public class TestSAX {
  public static void main(String[] args) {
    System.out.println("test");
    TestSAX testSax = new TestSAX();
    testSax.saxParse("src/main/java/com/briup/class.xml");
  }

  public void saxParse(String filePath) {
    // 1. 创建工厂对象
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    try {
      // 创建解析器对象
      SAXParser saxParser = saxParserFactory.newSAXParser();
      // 解析xml文件 重写DefaultHandler类中的方法 进行事件处理
      saxParser.parse(filePath, new DefaultHandler() {
        // 最常用的有5个事件
        @Override
        public void startDocument() throws SAXException {
          System.out.println("解析器发现了文档的开始标签-文档开头");
        }

        @Override
        public void endDocument() throws SAXException {
          System.out.println("解析器发现了文档的结束标签-文档结束");
        }

        @Override
        // uri 命名空间
        // localName 本地名称（不带前缀）
        // qName 限定的名称（带前缀）
        // attributes 属性列表
        public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
          // System.out.println("解析到了一个开始标签");
          // System.out.println("localName:" + localName);
          System.out.println("qName:" + qName);
          // 属性列表
          if (attributes.getLength() > 0) {
            // System.out.println("属性列表");
            for (int i = 0; i < attributes.getLength(); i++) {
              String name = attributes.getQName(i);
              String value = attributes.getValue(i);
              System.out.println(name + ":" + value);
            }
          }
        }
      });
    } catch (Exception e) {
      e.printStackTrace();
    }

  }
}
